From d88e65518ce7a653294aa180423ffbeca68437ac Mon Sep 17 00:00:00 2001 From: robertl Date: Fri, 14 Jul 2006 22:46:52 +0000 Subject: [PATCH] Convert Brauniger to new serial scheme. --- brauniger_iq.c | 280 ++++++++++++++++++++++--------------------------- 1 file changed, 127 insertions(+), 153 deletions(-) diff --git a/brauniger_iq.c b/brauniger_iq.c index 41759c1fd..b42c849da 100644 --- a/brauniger_iq.c +++ b/brauniger_iq.c @@ -19,18 +19,14 @@ */ #include "defs.h" -#include "jeeps/gpsserial.h" +#include "gbser.h" #include -/*static int32 fd;*/ -static char *port; +static void *serial_handle; #define MYNAME "BRAUNIGER-IQ" #define PRESTRKNAME "PRESALTTRK" -#define GPS_Serial_On(a, b) 0 -#define GPS_Serial_Off(a, b) 0 -#if 0 static enum { st_sync, st_fl_num, @@ -52,40 +48,23 @@ static enum { } state; static const int reqd_bytes[num_states] = { 6, 1, 2, 2, 25, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1 }; -#endif -static void rd_init(const char *fname) -{ - port = xstrdup(fname); - - // Fortunately the instruments use the same serial settings as the Garmin - // GPS receivers (9600-8-N) so we can use jeeps and hence we don't need - // to worry about OS dependencies here. - if (!GPS_Serial_On(port, &fd)) { - fatal(MYNAME ": Can't initialise port '%s'\n", port); - } +static void rd_init(const char *fname) { + if (serial_handle = gbser_init(fname), NULL == serial_handle) { + fatal(MYNAME ": Can't initialise port '%s'\n", fname); + } } -static void rd_deinit(void) -{ -#if BOOGER - if (!GPS_Serial_Off(port, fd)) { - fatal(MYNAME ": Can't shut down port '%s'\n", port); - } - if (!GPS_Serial_Close(fd, port)) { - fatal(MYNAME ": Can't close port '%s'\n", port); - } -#endif /* BOOGER */ - xfree(port); +static void rd_deinit(void) { + gbser_deinit(serial_handle); + serial_handle = NULL; } -#if 0 /** * Process a data record. * @return zero when all expected data has been received */ -static int process_data(const unsigned char *data) -{ +static int process_data(const unsigned char *data) { static int remaining = 100; static struct tm tm; static time_t start, creation; @@ -96,180 +75,175 @@ static int process_data(const unsigned char *data) int i; if (global_opts.debug_level >= 3) { - for (i = 0; i < reqd_bytes[state]; i++) { - printf("%.2x ", data[i]); - } - puts(""); + for (i = 0; i < reqd_bytes[state]; i++) { + printf("%.2x ", data[i]); + } + puts(""); } remaining -= reqd_bytes[state]; switch (state) { case st_sync: - if (memcmp(data, "\x30\x31\x32\x33\x34\x35", 6) != 0) { - fatal(MYNAME ": Could not synchronise\n"); - } - break; + if (memcmp(data, "\x30\x31\x32\x33\x34\x35", 6) != 0) { + fatal(MYNAME ": Could not synchronise\n"); + } + break; case st_fl_num: - if (global_opts.debug_level >= 1) { - printf(MYNAME ": Flight Number: %d\n", data[0]); - } - break; + if (global_opts.debug_level >= 1) { + printf(MYNAME ": Flight Number: %d\n", data[0]); + } + break; case st_data_len: - remaining = (data[0] << 8) + data[1] - 2; - if (global_opts.debug_level >= 1) { - printf(MYNAME ": Data Length: %d\n", remaining); - } - break; + remaining = (data[0] << 8) + data[1] - 2; + if (global_opts.debug_level >= 1) { + printf(MYNAME ": Data Length: %d\n", remaining); + } + break; case st_ser_num: - if (global_opts.debug_level >= 1) { - printf(MYNAME ": Serial Number: %d\n", (data[0] << 8) + data[1]); - } - break; + if (global_opts.debug_level >= 1) { + printf(MYNAME ": Serial Number: %d\n", (data[0] << 8) + data[1]); + } + break; case st_pilot_name: - if (global_opts.debug_level >= 1) { - printf(MYNAME ": Pilot Name: %.25s\n", data); - } - break; + if (global_opts.debug_level >= 1) { + printf(MYNAME ": Pilot Name: %.25s\n", data); + } + break; case st_start_date: - i = (data[0] << 8) + data[1]; - tm.tm_mday = i / 100; - tm.tm_mon = (i % 100) - 1; - break; + i = (data[0] << 8) + data[1]; + tm.tm_mday = i / 100; + tm.tm_mon = (i % 100) - 1; + break; case st_start_year: - tm.tm_year = ((data[0] << 8) + data[1]) - 1900; - break; + tm.tm_year = ((data[0] << 8) + data[1]) - 1900; + break; case st_max_alt_1: - if (global_opts.debug_level >= 1) { - printf(MYNAME ": Max Altitude 1: %dm\n", (data[0] << 8) + data[1]); - } - break; + if (global_opts.debug_level >= 1) { + printf(MYNAME ": Max Altitude 1: %dm\n", (data[0] << 8) + data[1]); + } + break; case st_max_alt_2: - if (global_opts.debug_level >= 1) { - printf(MYNAME ": Max Altitude 2: %dm\n", (data[0] << 8) + data[1]); - } - break; + if (global_opts.debug_level >= 1) { + printf(MYNAME ": Max Altitude 2: %dm\n", (data[0] << 8) + data[1]); + } + break; case st_max_climb: - if (global_opts.debug_level >= 1) { - i = (data[0] << 8) + data[1]; - printf(MYNAME ": Max climb: %d.%dm/s\n", i / 10, i % 10); - } - break; + if (global_opts.debug_level >= 1) { + i = (data[0] << 8) + data[1]; + printf(MYNAME ": Max climb: %d.%dm/s\n", i / 10, i % 10); + } + break; case st_flight_dur: - if (global_opts.debug_level >= 1) { - i = (data[0] << 8) + data[1]; - printf(MYNAME ": Flight Time: %d:%d\n", i / 100, i % 100); - } - break; + if (global_opts.debug_level >= 1) { + i = (data[0] << 8) + data[1]; + printf(MYNAME ": Flight Time: %d:%d\n", i / 100, i % 100); + } + break; case st_log_ival: - interval = data[0]; - if (global_opts.debug_level >= 1) { - printf(MYNAME ": Logging Interval: %ds\n", interval); - } - break; + interval = data[0]; + if (global_opts.debug_level >= 1) { + printf(MYNAME ": Logging Interval: %ds\n", interval); + } + break; case st_start_time: - i = (data[0] << 8) + data[1]; - tm.tm_hour = i / 100; - tm.tm_min = (i % 100) - 1; - tm.tm_sec = 0; - creation = start = mktime(&tm); - if (global_opts.debug_level >= 1) { - printf(MYNAME ": Start Time: %s", ctime(&start)); - } - break; + i = (data[0] << 8) + data[1]; + tm.tm_hour = i / 100; + tm.tm_min = (i % 100) - 1; + tm.tm_sec = 0; + creation = start = mktime(&tm); + if (global_opts.debug_level >= 1) { + printf(MYNAME ": Start Time: %s", ctime(&start)); + } + break; case st_end_time: - i = (data[0] << 8) + data[1]; - tm.tm_hour = i / 100; - tm.tm_min = (i % 100) - 1; - finish = mktime(&tm); - if (global_opts.debug_level >= 1) { - printf(MYNAME ": End Time: %s", ctime(&finish)); - } - if (remaining) { - track = route_head_alloc(); - track->rte_name = xstrdup(PRESTRKNAME); - track->rte_desc = xstrdup("Brauniger-IQ Barograph"); - track_add_head(track); - } else { - warning(MYNAME ": No barograph recorded for this flight\n"); - } - break; + i = (data[0] << 8) + data[1]; + tm.tm_hour = i / 100; + tm.tm_min = (i % 100) - 1; + finish = mktime(&tm); + if (global_opts.debug_level >= 1) { + printf(MYNAME ": End Time: %s", ctime(&finish)); + } + if (remaining) { + track = route_head_alloc(); + track->rte_name = xstrdup(PRESTRKNAME); + track->rte_desc = xstrdup("Brauniger-IQ Barograph"); + track_add_head(track); + } else { + warning(MYNAME ": No barograph recorded for this flight\n"); + } + break; case st_sample_alt: - wpt = waypt_new(); - wpt->latitude = wpt->longitude = 0.0; - wpt->creation_time = creation; - creation += interval; - wpt->altitude = (data[0] << 8) + data[1]; - track_add_wpt(track, wpt); - if (global_opts.debug_level >= 2) { - printf(MYNAME ": remaining=%d, Altitude=%fm, ", remaining, wpt->altitude); - } - break; + wpt = waypt_new(); + wpt->latitude = wpt->longitude = 0.0; + wpt->creation_time = creation; + creation += interval; + wpt->altitude = (data[0] << 8) + data[1]; + track_add_wpt(track, wpt); + if (global_opts.debug_level >= 2) { + printf(MYNAME ": remaining=%d, Altitude=%fm, ", remaining, wpt->altitude); + } + break; case st_sample_spd: - if (global_opts.debug_level >= 2) { - printf("Airspeed=%dkmh\n", data[0]); - } - state = st_sample_alt; - return remaining; + if (global_opts.debug_level >= 2) { + printf("Airspeed=%dkmh\n", data[0]); + } + state = st_sample_alt; + return remaining; default: - fatal(MYNAME ": Bad internal state\n"); + fatal(MYNAME ": Bad internal state\n"); } state++; return remaining; } -#endif -static void data_read(void) -{ -#if BOOGER +static void data_read(void) { unsigned char ibuf[25]; - int32 rd_cnt, ofs; + int rd_cnt; if (global_opts.debug_level >= 0) { - puts(MYNAME ": Select recorded flight in memo mode."); - puts(MYNAME ": Press Memo button for two seconds..."); + puts(MYNAME ": Select recorded flight in memo mode."); + puts(MYNAME ": Press Memo button for two seconds..."); } + // Wait until something arrives - while (!GPS_Serial_Wait(fd)); if (global_opts.debug_level >= 0) { - puts(MYNAME ": Downloading flight..."); + puts(MYNAME ": Downloading flight..."); } - // Read data until there is none left to read + + // Read data until there is none left to read state = st_sync; - ofs = 0; - do { - if (0 > (rd_cnt = GPS_Serial_Read(fd, ibuf + ofs, reqd_bytes[state] - ofs))) { - fatal(MYNAME ": Error reading port '%s', %s\n", port, strerror(errno)); - } - if (reqd_bytes[state] == rd_cnt + ofs) { - if (!process_data(ibuf)) { - if (global_opts.debug_level >= 0) { - puts(MYNAME " ...Finished"); + for (;;) { + /* wait up to 5 seconds for more data */ + rd_cnt = gbser_read_wait(serial_handle, ibuf, reqd_bytes[state], 5000); + if (rd_cnt < 0) { + fatal(MYNAME ": Serial error\n"); + } else if (rd_cnt < reqd_bytes[state]) { + fatal(MYNAME ": Incomplete download\n"); + } + + if (!process_data(ibuf)) { + if (global_opts.debug_level >= 0) { + puts(MYNAME " ...Finished"); + } + return; } - return; - } - ofs = 0; - } else { - ofs += rd_cnt; } - } while (GPS_Serial_Wait(fd)); - fatal(MYNAME ": Incomplete download\n"); -#endif } static arglist_t brauniger_iq_args[] = { -- 2.30.2